﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.BL;
using GestionePolveriLib.Facades;
using GestionePolveri2.DAL;
using System.Transactions;


namespace GestionePolveri2
{
    public partial class AllineamentoInventarioDialog : Form
    {
        private ScortaMinimaInfo m_scortaMinimaInfo = null;
        private LottoFacade m_lottoFacade = null;
        //private int m_causale;
        private int pippo = 0;

        public ScortaMinimaInfo ScortaMinimaInfo
        {
            get { return m_scortaMinimaInfo; }
            set
            {
                m_scortaMinimaInfo = value;

                this.label1.Text = string.Format("Codice Polvere: {0} - Descrizione: {1}", m_scortaMinimaInfo.CodicePolvere, m_scortaMinimaInfo.Descrizione);
                //dynCodicePolvere.Text = m_scortaMinimaInfo.CodicePolvere;
                //dynDescrizione.Text = m_scortaMinimaInfo.Descrizione;
            }
        }

        public AllineamentoInventarioDialog()
        {
            InitializeComponent();

            m_lottoFacade = new LottoFacade();

            this.objectListView1.CellEditFinishing += new BrightIdeasSoftware.CellEditEventHandler(objectListView1_CellEditFinishing);
        }

        private void objectListView1_CellEditFinishing(object sender, BrightIdeasSoftware.CellEditEventArgs e)
        {
            Lotto2 pp = (Lotto2)e.RowObject;

            pp.NuovaGiacenza = double.Parse(e.NewValue.ToString());
        }

        protected override void OnShown(EventArgs e)
        {
            base.OnShown(e);

            LoadLotti();
        }

        private void LoadLotti()
        {
            List<Lotto2> lotti = m_lottoFacade.GetLottiAllineamento(m_scortaMinimaInfo.ID);

            this.objectListView1.SetObjects(lotti);

            NascondiColonne();
        }

        private void NascondiColonne()
        {
            OperatorePrincipal m_OperatorePrincipale = (OperatorePrincipal)System.Threading.Thread.CurrentPrincipal;
            if (m_OperatorePrincipale.IsInRole("Produzione") || m_OperatorePrincipale.IsInRole("Verniciatura"))
            {
                this.objectListView1.AllColumns.Remove(this.olvColumnPrezzoUnitario);
                this.objectListView1.AllColumns.Remove(this.olvColumnValore);
                this.objectListView1.AllColumns.Remove(this.olvColumnNumFattura);
                this.objectListView1.AllColumns.Remove(this.olvColumnDataFattura);

                this.objectListView1.RebuildColumns();
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            bool agg=false;
            foreach (Lotto2 lot in this.objectListView1.Objects)
            {
                if (!(lot.NuovaGiacenza == null))
                {                    
                    if (lot.NuovaGiacenza > lot.Giacenza)
                    {
                        CreoMovCarico(lot);
                        agg=true;
                    }

                    if (lot.NuovaGiacenza < lot.Giacenza)
                    {
                        CreoMovScarico(lot);
                        agg=true;
                    }
                }
            }
            if (agg)
                MessageBox.Show("Allineamento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                MessageBox.Show("Nessun Allineamento Effettuato !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private bool CreoMovCarico(Lotto2 lotto)
        {

            bool retValue = false;

            using (TransactionScope transaction = new TransactionScope())
            {
                // inserisco prima il record relativo al lotto
                Lotto lot = new Lotto();
                lot.CodLotto = lotto.CodLotto;
                lot.NumDdt = "N.D";
                lot.DataDdt = DateTime.Now;
                lot.DataScadenzaLotto = lotto.DataScadenzaLotto;

                lot.IDPolvere = lotto.IDPolvere;
                lot.Giacenza = (double)(lotto.NuovaGiacenza - lotto.Giacenza);
                lot.PrezzoUnitario = lotto.PrezzoUnitario;
                lot.Valore = lot.Giacenza * lot.PrezzoUnitario;

                LottoFacade impl = new LottoFacade();
                long idl = impl.AddLotto(lot);

                // inserisco il record relativo al movimento
                Movimento imp = new Movimento();

                CausaliMagazzinoFacade cmf = new CausaliMagazzinoFacade();
                imp.IDCausale = cmf.GetCausaleByCod("C").ID;

                imp.DataMovimento = DateTime.Now;
                imp.DataRegistrazione = DateTime.Now;

                imp.IDPolvere = lotto.IDPolvere;
                imp.Quantita = (double)(lotto.NuovaGiacenza - lotto.Giacenza);

                MovimentiFacade mv = new MovimentiFacade();

                imp.IDFormato = lotto.IDFormato;
                imp.Formato = lotto.Formato;
                imp.NumScatole = imp.Quantita / lotto.Pezzatura;

                CausaliScaricoFacade pf = new CausaliScaricoFacade();
                imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico("I")).ID;

                imp.Note = "Allineamento inventario";
                imp.IDOperatore = ((OperatorePrincipal)System.Threading.Thread.CurrentPrincipal).Operatore.ID;
                imp.IDLotto = idl;

                MovimentiFacade impf = new MovimentiFacade();
                impf.AddMovimento(imp);

                // gestione dello stato di movimentazione del lotto...
                impl.UpdateStatoMovimentazione(idl, false);

                transaction.Complete();

                //MessageBox.Show("Inserimento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                retValue = true;
            }

            //btnCreatePolvereXXXX.Enabled = false;

            //    OnLoadData(EventArgs.Empty);
            //}

            return retValue;
        }

        private bool CreoMovScarico(Lotto2 lotto)
        {

            bool retValue = false;

            using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
            {
                // inserisco il record relativo al movimento di scarico
                Movimento imp = new Movimento();
                imp.GiacenzaInsufficienteFlag = false;
                imp.SottoScortaFlag = false;

                CausaliMagazzinoFacade cmf = new CausaliMagazzinoFacade();
                imp.IDCausale = cmf.GetCausaleByCod("S").ID;

                imp.DataMovimento = DateTime.Now;
                imp.DataRegistrazione = DateTime.Now;

                imp.IDPolvere = lotto.IDPolvere;

                MovimentiFacade mv = new MovimentiFacade();

                int m_causale = cmf.GetCausaleByCod("C").ID;
                Movimento2 mov = (Movimento2)mv.GetMovimentoByLotto(lotto.IDLotto, m_causale);
                imp.IDFormato = mov.IDFormato;
                imp.Formato = mov.Formato;

                imp.Quantita = (double)(lotto.Giacenza - lotto.NuovaGiacenza);

                imp.NumScatole = imp.Quantita / mov.Pezzatura;

                //imp.Giacenza = lotto.NuovaGiacenza;
                //imp.Valore = imp.Giacenza * lotto.PrezzoUnitario;

                imp.Note = "Allineamento inventario";
                ImpiantoFacade fi = new ImpiantoFacade();
                imp.IDImpianto = ((Impianto)fi.GetImpiantoByNome("Inventario")).ID;


                imp.IDOperatore = ((OperatorePrincipal)System.Threading.Thread.CurrentPrincipal).Operatore.ID;
                imp.IDLotto = lotto.IDLotto;

                CausaliScaricoFacade pf = new CausaliScaricoFacade();
                imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico("I")).ID;

                MovimentiFacade impf = new MovimentiFacade();
                impf.AddMovimento(imp);

                // gestione dello stato di movimentazione del lotto...
                LottoFacade lot = new LottoFacade();
                lot.UpdateStatoMovimentazione(imp.IDLotto, true);

                // aggiunge i colori associati alla polvere movimentata nello storico colori movimenti...
                ComposizioneColoreFacadeExt ccf = new ComposizioneColoreFacadeExt();
                List<Colore> m_coloriAssociati = ccf.GetColoriAssociati(lotto.IDPolvere);
                impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "I");

                // aggiunge la traccia nello storico movimenti...
                //impf.AddToStoricoMovimenti(imp);

                //Aggiorno la giacenza lotto                    
                lot.AggLotto(lotto.IDLotto, imp.Quantita);

                //impf.AddToStoricoMovimenti(imp);

                transaction.Complete();

                retValue = true;
            }

            return retValue;
        }


        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnNuovo_Click(object sender, EventArgs e)
        {
            NuovoLottoDialog nld = new NuovoLottoDialog();
            nld.PolvereInfo = m_scortaMinimaInfo;
            if (nld.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Lotto2 l = new Lotto2();
                l.CodLotto = nld.LottoInfo.CodLotto;
                l.DataDdt = DateTime.Now;
                l.NumDdt = "N.D";
                l.IDPolvere = nld.PolvereInfo.ID;
                l.DataScadenzaLotto = nld.LottoInfo.DataScadenzaLotto;
                l.Giacenza = nld.LottoInfo.Giacenza;
                l.NuovaGiacenza = nld.LottoInfo.NuovaGiacenza;
                l.IDFormato = nld.LottoInfo.IDFormato;
                l.Formato = nld.LottoInfo.Formato;
                l.Pezzatura = nld.LottoInfo.Pezzatura;

                this.objectListView1.AddObject(l);
            }
        }



    }
}
